package frame.util;

// 处理byte的工具类
public class ByteUtil {

    // 检测该byte的低i位是否为0
    public static boolean isZeroBit(byte b, int index) {

        return (b & (1 << index)) == 0;
    }

    // 检测该byte的低i位是否不为0
    public static boolean isNotZeroBit(byte b, int index) {

        return !isZeroBit(b, index);
    }

    // 将一对byte转化为一个short
    public static short bytePairToShort(byte h, byte l) {

        return (short) ((Byte.toUnsignedInt(h) << 8) + Byte.toUnsignedInt(l));
    }

    // 将一对byte转化为一个int
    public static int bytePairToInt(byte h, byte l) {

        return ((Byte.toUnsignedInt(h) << 8) + Byte.toUnsignedInt(l));
    }

    // 将4个byte转化为一个int
    public static int bytePairToInt(byte hh, byte hl, byte lh, byte ll) {

        return byteArrayToInt(new byte[] { hh, hl, lh, ll });
    }

    // 将包含4个byte的数组转化为一个int
    public static int byteArrayToInt(byte[] bytes) {

        switch(bytes.length) {

            case 1: return bytes[0];

            case 2: return bytePairToInt(bytes[0], bytes[1]);

            case 3: return (bytePairToInt((byte) 0x0, bytes[0]) << 16) + bytePairToInt(bytes[1], bytes[2]);

            case 4: return (bytePairToInt(bytes[0], bytes[1]) << 16) + bytePairToInt(bytes[2], bytes[3]);

            default: return 0;
        }
    }

    // 将一个short拆分成2个byte
    public static byte[] shortToBytes(short s) {

        return new byte[] { (byte) (s >>> 8), (byte) s };
    }

    // 将一个int拆分成4个byte
    public static byte[] intToBytes(int s) {

        return new byte[] { (byte) (s >>> 24), (byte) (s >>> 16), (byte) (s >>> 8), (byte) s };
    }
}
